import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'

// 创建一个axios实例， 不要自己写完，从网站上赋值过来，我们只写自己的业务代码
// axios没有官网，直接github的地址，文档就是reademe文档（需要fq），所以我们看的中文文档，个人写的
// https://axios-http.com/zh/docs/instance
const request = axios.create({
  // 所有请求的公共前缀，方便我们写代理
  // baseURL: 'http://192.168.72.176:9007',
  baseURL: '/likede/api',
  // baseURL: 'http://192.168.72.61:9007',
  // 超时时间，超过6s，就当这个请求报错了，会自动断开
  timeout: 6000
})

// 给所有请求添加一些内容，请求拦截器，响应拦截器
// 拦截器的代码结构不用自己写，网上有，直接拿过来，我们直接拦截器里面的业务代码
// 添加请求拦截器：
// 有两个参数， 一个是请求发送成功的回调函数， 一个是请求发送失败的回调函数
request.interceptors.request.use(function (config) {
  // 给所有的请求头添加一个token
  if (store.state.user.token) {
    console.log('haha', store.state.user.token)
    // 模板字符串，+号拼接字符串也可以，但容易出错。
    // config.headers.Authorization = `Bearer ${store.state.user.token}`
    config.headers.Authorization = store.state.user.token
  }

  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
// 有两个参数， 第一个参数是响应成功的回调函数 ===> http状态码是 200
// 第二个参数是 响应失败的的回调函数 ===> http状态码 4xx 5xx
request.interceptors.response.use(function (res) {
  // 判断获取验证码是否成功
  if (res.status === 200) {
    return res
  }
  // 响应得到的值是二进制 比如表格导入导出
  if (res.data instanceof Blob) {
    console.log(res.data, 111)
    return res.data
  }

  // 如果用户名或者密码输入错误，http请求的状态码依然是200，也算请求成功
  // 用户名或者密码输入错误 应该给用户提示报错了，而不是将数据脱壳去返回
  // console.log(2, response)
  // 这里就是对服务器的数据进行脱壳处理
  // return response.data
  // 下面在这个响应成功的回调函数里面，做业务成功或者失败的判断
  if (res.data.success) {
    // 这里就是业务成功
    return res.data
  }
  // 这里是业务失败执行的逻辑代码
  Message.error(res.data.message || '请求业务失败')
  return Promise.resolve(res)
}, function (error) {
  // token失效或 token错误时，状态码为401，需要删除token和用户信息，退回到login页面
  if (error.response?.status === 401) {
    // store.commit('user/removeTokenMutation')
    // store.commit('user/removeUserInfoMutation')
    store.dispatch('user/logOutAction')
    router.push('/login')
  }
  return Promise.reject(error)
})

export default request
